package com.mjf.spark.day08

import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

/**
 * 演示RDD&DF&DS之间关系以及转换
 */
object SparkSQL01_Demo {
  def main(args: Array[String]): Unit = {

    // 创建SparkConf配置文件对象
    val conf: SparkConf = new SparkConf().setAppName("SparkSQL01_Demo").setMaster("local[*]")

    // 创建SparkSQL执行的入口对象  SparkSession
    val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()

    // 注意：spark不是包名，也不是类名。是我们创建的入口对象SparkSession的名称
    import spark.implicits._

    // 读取json文件，创建DataFrame
    val df: DataFrame = spark.read.json("D:\\code\\spark\\input\\test.json")

    // 查看df里面的数据
//    df.show()

    // SQL语法风格
//    df.createOrReplaceTempView("user")
//    spark.sql("select * from user").show()

    // DSL风格
//    df.select("name", "age").show()

    // RDD--->DataFrame--->DataSet
    // 创建RDD
    val rdd: RDD[(Int, String, Int)] = spark.sparkContext.makeRDD(List((1, "shy", 20), (2, "lucy", 18), (3, "tina", 18)))

    // RDD--->DataFrame
    val df1: DataFrame = rdd.toDF("id", "name", "age")
//    df1.show()

    // RDD--->DataSet
    val ds: Dataset[(Int, String, Int)] = rdd.toDS()
//    ds.show()

    // DataFrame--->DataSet
    val ds1: Dataset[User] = df1.as[User]
//    ds1.show()

    // DataSet--->DataFrame--->RDD
    val df2: DataFrame = ds1.toDF()
    df2.show()

    val rdd1: RDD[Row] = df2.rdd
    rdd1.collect().foreach(println)

    // 释放资源
    spark.close()

  }
}

case class User(id:Int, name:String, age:Int)